/**
 * 弹幕配置管理Hook
 * 基于弹幕设置系统技术文档实现
 */

import { useState, useCallback, useRef, useEffect } from 'react'

// 基础配置类型定义
export interface BarrageRenderConfig {
  // 基础渲染参数
  heightReduce: number        // Canvas高度减少量
  speed: number              // 弹幕运行速度(像素/秒)
  renderRegion: number       // 显示区域(0-1)
  minSpace: number           // 滚动弹幕最小间距
  avoidOverlap: boolean      // 是否避免重叠
  maxDisplayCount: number    // 最大同时显示数量
  trackFillMode: 'sparse' | 'normal' | 'dense' | 'maximum'  // 轨道填充模式
  
  // 视觉效果参数
  opacity: number            // 透明度(0-1)
  fontFamily: string         // 字体
  fontWeight: string         // 字体粗细
  
  // 字体描边和阴影
  strokeStyle?: string       // 描边颜色
  lineWidth?: number         // 描边宽度
  lineJoin?: CanvasLineJoin  // 描边连接方式
  shadowColor?: string       // 阴影颜色
  shadowBlur?: number        // 阴影模糊度
  shadowOffsetX?: number     // 阴影X偏移
  shadowOffsetY?: number     // 阴影Y偏移
}

// 弹幕类型过滤配置
export interface BarrageTypeFilter {
  scroll: boolean    // 滚动弹幕
  top: boolean       // 顶部弹幕
  bottom: boolean    // 底部弹幕
  color: boolean     // 彩色弹幕
  senior: boolean    // 高级弹幕
}

// 智能屏蔽配置
export interface SmartBlockConfig {
  enabled: boolean           // 是否启用智能屏蔽
  levelThreshold: number     // 等级阈值
  keywords: string[]         // 屏蔽关键词列表
}

// 完整的弹幕配置
export interface BarrageConfig {
  renderConfig: BarrageRenderConfig
  typeFilter: BarrageTypeFilter
  smartBlock: SmartBlockConfig
  antiOcclusionMode: 'none' | 'gradient' | 'pure-mask' | 'portrait'
}

// 默认配置
const DEFAULT_RENDER_CONFIG: BarrageRenderConfig = {
  heightReduce: 0,
  speed: 200,
  opacity: 1,
  renderRegion: 1,
  fontFamily: 'Microsoft YaHei',
  fontWeight: 'normal',
  avoidOverlap: true,
  minSpace: 10,
  maxDisplayCount: 50,
  trackFillMode: 'normal',
  strokeStyle: undefined,
  lineWidth: 0,
  lineJoin: 'round',
  shadowColor: undefined,
  shadowBlur: 0,
  shadowOffsetX: 0,
  shadowOffsetY: 0,
}

const DEFAULT_TYPE_FILTER: BarrageTypeFilter = {
  scroll: true,
  top: true,
  bottom: true,
  color: true,
  senior: true,
}

const DEFAULT_SMART_BLOCK: SmartBlockConfig = {
  enabled: false,
  levelThreshold: 1,
  keywords: [],
}

const DEFAULT_CONFIG: BarrageConfig = {
  renderConfig: DEFAULT_RENDER_CONFIG,
  typeFilter: DEFAULT_TYPE_FILTER,
  smartBlock: DEFAULT_SMART_BLOCK,
  antiOcclusionMode: 'none',
}

// 预设配置
export const SPEED_PRESETS = [
  { label: '100', value: 100 },
  { label: '150', value: 150 },
  { label: '200', value: 200 },
  { label: '250', value: 250 },
  { label: '300', value: 300 },
]

export const RENDER_REGION_PRESETS = [
  { label: '1/4', value: 0.25 },
  { label: '半屏', value: 0.5 },
  { label: '3/4', value: 0.75 },
  { label: '全屏', value: 1 },
]

export const DISPLAY_COUNT_PRESETS = [
  { label: '少量', value: 20 },
  { label: '适中', value: 50 },
  { label: '较多', value: 80 },
  { label: '大量', value: 120 },
]

export const TRACK_FILL_MODE_PRESETS = [
  { label: '稀疏', value: 'sparse', minSpace: 20, description: '弹幕间距较大，视觉清晰' },
  { label: '适中', value: 'normal', minSpace: 10, description: '平衡密度和可读性' },
  { label: '密集', value: 'dense', minSpace: 5, description: '弹幕排列紧密' },
  { label: '最大化', value: 'maximum', minSpace: 2, description: '所有轨道充满弹幕' },
] as const

export const STROKE_SHADOW_PRESETS = [
  {
    id: 1,
    name: '无',
    config: {}
  },
  {
    id: 2,
    name: '绿色描边',
    config: {
      strokeStyle: 'green',
      lineWidth: 2,
      lineJoin: 'round' as CanvasLineJoin,
    }
  },
  {
    id: 3,
    name: '紫色投影',
    config: {
      shadowColor: '#B303F2',
      shadowBlur: 2,
      shadowOffsetX: 2,
      shadowOffsetY: 2,
    }
  }
]

/**
 * 弹幕配置管理Hook
 */
export function useBarrageConfig(barrageRenderer?: any) {
  const [config, setConfig] = useState<BarrageConfig>(DEFAULT_CONFIG)
  const configRef = useRef<BarrageConfig>(config)

  // 更新配置引用
  useEffect(() => {
    configRef.current = config
  }, [config])

  // 从localStorage加载配置
  const loadConfig = useCallback(() => {
    try {
      const saved = localStorage.getItem('barrage-config')
      if (saved) {
        const parsedConfig = JSON.parse(saved)
        setConfig(prev => ({ ...prev, ...parsedConfig }))
      }
    } catch (error) {
      // console.warn('加载弹幕配置失败:', error)
    }
  }, [])

  // 保存配置到localStorage
  const saveConfig = useCallback((newConfig: BarrageConfig) => {
    try {
      localStorage.setItem('barrage-config', JSON.stringify(newConfig))
    } catch (error) {
      // console.warn('保存弹幕配置失败:', error)
    }
  }, [])

  // 更新渲染配置
  const updateRenderConfig = useCallback((updates: Partial<BarrageRenderConfig>) => {
    setConfig(prev => {
      const newConfig = {
        ...prev,
        renderConfig: { ...prev.renderConfig, ...updates }
      }
      saveConfig(newConfig)
      
      // 应用到渲染器
      if (barrageRenderer && 'updateConfig' in barrageRenderer) {
        barrageRenderer.updateConfig(updates)
      }
      
      return newConfig
    })
  }, [barrageRenderer, saveConfig])

  // 更新类型过滤
  const updateTypeFilter = useCallback((updates: Partial<BarrageTypeFilter>) => {
    setConfig(prev => {
      const newConfig = {
        ...prev,
        typeFilter: { ...prev.typeFilter, ...updates }
      }
      saveConfig(newConfig)
      return newConfig
    })
  }, [saveConfig])

  // 更新智能屏蔽
  const updateSmartBlock = useCallback((updates: Partial<SmartBlockConfig>) => {
    setConfig(prev => {
      const newConfig = {
        ...prev,
        smartBlock: { ...prev.smartBlock, ...updates }
      }
      saveConfig(newConfig)
      return newConfig
    })
  }, [saveConfig])

  // 更新防挡模式
  const updateAntiOcclusionMode = useCallback((mode: BarrageConfig['antiOcclusionMode']) => {
    setConfig(prev => {
      const newConfig = { ...prev, antiOcclusionMode: mode }
      saveConfig(newConfig)
      return newConfig
    })
  }, [saveConfig])

  // 重置配置
  const resetConfig = useCallback(() => {
    setConfig(DEFAULT_CONFIG)
    saveConfig(DEFAULT_CONFIG)
    
    if (barrageRenderer && 'updateConfig' in barrageRenderer) {
      barrageRenderer.updateConfig(DEFAULT_RENDER_CONFIG)
    }
  }, [barrageRenderer, saveConfig])

  // 初始化时加载配置
  useEffect(() => {
    loadConfig()
  }, [loadConfig])

  return {
    config,
    updateRenderConfig,
    updateTypeFilter,
    updateSmartBlock,
    updateAntiOcclusionMode,
    resetConfig,
    loadConfig,
    saveConfig,
  }
}

export default useBarrageConfig
